#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>


int nLignes(char *file) {
  /* Return the number of lines of a file
     or -1 in case of error */
  FILE *fp;
  int n,c;
 
  fp = fopen(file,"r");
  if (fp == NULL) {
    return -1;
  }
  while ((c = fgetc(fp)) != EOF) {
    if (c == '\n'){
      n++;
    }
  }
  fclose(fp);
  return n;
}
int isFile(char *file) {
  struct stat statfile;
  
  if (lstat(file, &statfile) != 0) {
    perror("Erreur isFile");
    abort();
  }
  return S_ISREG(statfile.st_mode);
}

int main(int argc, char *argv[]) {
    /* Descripteur de dossier */
  DIR             *dip;
  struct dirent   *dit; 

  int n;

  if (argc != 2) {
    printf("USAGE = line fichier/répertoire\n");
    exit(1);
  }


  printf("Détermination du type de %s\n",argv[1]);
  if (isFile(argv[1]) == 0) {
    /* Fichier pas ouvrable, ce doit être un répertoire */
    /* On essaye donc de le parcourir */
    printf("Ce n'est pas un fichier...\n");
    printf("Ouverture du dossier %s\n",argv[1]);
    dip = opendir(argv[1]);
    if (dip == NULL) {
      printf("Erreur lors de l'ouverture du répertoire\n");
      abort();
    }
    while ((dit = readdir(dip)) != NULL) {
      if (isFile(dit->d_name) == 0) {
        printf("Fichier %s\n",dit->d_name);
      }
      else {
        n = nLignes(dit->d_name);
        printf("Fichier %s : %i lignes\n",dit->d_name,n);
      }
    }
  }
  else {
    n=nLignes(argv[1]);
    printf("Nombre de ligne du fichier : %i\n", n);
  }
  return EXIT_SUCCESS;
}
